package com.labot.model;

import java.io.Serializable;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.AccessType;

import com.labot.types.AvisoType;
import com.labot.types.BitacoraEventType;
import com.labot.types.EstadoPNMType;
import com.labot.types.MuestraType;
import com.labot.types.ReclamoType;
import com.labot.types.SiNoType;

/**
 * This class represents the basic "user" object in AppFuse that allows for authentication
 * and user management.  It implements Acegi Security's UserDetails interface.
 *
 * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
 *         Updated by Dan Kibler (dan@getrolling.com)
 *         Extended to implement Acegi UserDetails interface
 *         by David Carter david@carter.net
 */

@Entity
@Table(name="app_pedidosnoconformes")
@AccessType("field")
public class PedidoNoConforme extends BaseObject implements Serializable {

    private static final long serialVersionUID = -1;
    
    @Column(name="fecha")
    private Date fecha;
    
    @OneToOne
    @JoinColumn(name="centro")
    private Centro centro;
    
    @Column(name="protocolo_numero")
    private String numeroprotocolo;
    
    @Column(name="nombre_paciente")
    private String nombrepaciente;
    
    @OneToOne
    @JoinColumn(name="area_solicita")
    private Area areasolicita;
    
    
    @Column(name="persona_detecta")
    private String personadetecta;
    
    @Column(name="determinacion")
    private String determinacion;
    
    @OneToOne
    @JoinColumn(name="clasificacion_id")
    private ClasificacionMuestra clasificacion;
    
    @Column(name="cantidad")
    private Integer cantidad;
    
    @Column(name = "tipo_reclamo", nullable = false, length = 50)
    @Enumerated(EnumType.STRING)
    private ReclamoType reclamo;
    
    @Column(name = "tipo_muestra", nullable = false, length = 50)
    @Enumerated(EnumType.STRING)
    private MuestraType tipomuestra;
    
    @Column(name = "urgente", nullable = false, length = 50)
    @Enumerated(EnumType.STRING)
    private SiNoType urgente;
    
    @Column(name="detalle" , length = 250)
    private String detalle;
    
    @Column(name = "estado_pnm", nullable = false, length = 50)
    @Enumerated(EnumType.STRING)
    private EstadoPNMType estadopnm;
    
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable( name = "area_pedidonoconforme", 
                joinColumns = { @JoinColumn(name = "area_id")}, 
                inverseJoinColumns={@JoinColumn(name="nuevamuestra_id")})  
    private Set<Area> areas;
    
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable( name = "areanotificada_pedidonoconforme", 
                joinColumns = { @JoinColumn(name = "area_id")}, 
                inverseJoinColumns={@JoinColumn(name="pedidonoconforme_id")})  
    private Set<Area> areasnotificadas;
    
    @OneToMany (
            cascade = {CascadeType.ALL},
            fetch = FetchType.LAZY
       )
       @JoinColumn (name = "nuevamuestraId")
    private Set<PedidoNoConformeBitacora> bitacoras = new HashSet<PedidoNoConformeBitacora>();
    
    @Column(name = "lastUpdate")
    private Date lastupdate;
    
    @Column(name = "deletionTime")
    private Date deletiontime;
    
    
    @Column(name = "tipoaviso", length = 50)
    @Enumerated(EnumType.STRING)
    private AvisoType tipoaviso;
    
    @OneToOne
    @JoinColumn(name="centroconcurre_id")
    private Centro centroconcurre;
    
    @Column(name = "infodadaalpaciente")
    private String infodadaalpaciente;
    
    @Column(name = "nuevoprotocolo")
    private String nuevoprotocolo;
    
    @Column(name = "contacto")
    private String contacto;
    
    public PedidoNoConforme() {
    }
    
    

	public Date getFecha() {
		return fecha;
	}



	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}



	


	public Centro getCentro() {
		return centro;
	}



	public void setCentro(Centro centro) {
		this.centro = centro;
	}



	public String getNumeroprotocolo() {
		return numeroprotocolo;
	}



	public void setNumeroprotocolo(String numeroprotocolo) {
		this.numeroprotocolo = numeroprotocolo;
	}



	public String getNombrepaciente() {
		return nombrepaciente;
	}



	public void setNombrepaciente(String nombrepaciente) {
		this.nombrepaciente = nombrepaciente;
	}



	public Area getAreasolicita() {
		return areasolicita;
	}



	public void setAreasolicita(Area areasolicita) {
		this.areasolicita = areasolicita;
	}


	public String getPersonadetecta() {
		return personadetecta;
	}



	public void setPersonadetecta(String personadetecta) {
		this.personadetecta = personadetecta;
	}



	public String getDeterminacion() {
		return determinacion;
	}



	public void setDeterminacion(String determinacion) {
		this.determinacion = determinacion;
	}



	public ClasificacionMuestra getClasificacion() {
		return clasificacion;
	}



	public void setClasificacion(ClasificacionMuestra clasificacion) {
		this.clasificacion = clasificacion;
	}



	public Integer getCantidad() {
		return cantidad;
	}



	public void setCantidad(Integer cantidad) {
		this.cantidad = cantidad;
	}



	public ReclamoType getReclamo() {
		return reclamo;
	}



	public void setReclamo(ReclamoType reclamo) {
		this.reclamo = reclamo;
	}



	public String getDetalle() {
		return detalle;
	}



	public void setDetalle(String detalle) {
		this.detalle = detalle;
	}



	public EstadoPNMType getEstadopnm() {
		return estadopnm;
	}



	public void setEstadopnm(EstadoPNMType estadopnm) {
		this.estadopnm = estadopnm;
	}



	public Set<Area> getAreas() {
		return areas;
	}



	public void setAreas(Set<Area> areas) {
		this.areas = areas;
	}


	public void agregarArea(Area area){
		this.areas.add(area);
	}

	public Set<PedidoNoConformeBitacora> getBitacoras() {
		return bitacoras;
	}
	
	public Set<PedidoNoConformeBitacora> getBitacorasFirmas() {
		Set<PedidoNoConformeBitacora> bitacorasfirmas = new HashSet<PedidoNoConformeBitacora>();
		for (PedidoNoConformeBitacora b : this.bitacoras) {
			if(b.getEvento().equals(BitacoraEventType.FIRMAS)){
				bitacorasfirmas.add(b);
			}
		}
		return bitacorasfirmas;
	}



	public void setBitacoras(Set<PedidoNoConformeBitacora> bitacoras) {
		this.bitacoras = bitacoras;
	}
	
	public void agregarBitacora(PedidoNoConformeBitacora bitacora){
		this.bitacoras.add(bitacora);
	}



	public Date getLastupdate() {
		return lastupdate;
	}



	public void setLastupdate(Date lastupdate) {
		this.lastupdate = lastupdate;
	}



	public Date getDeletiontime() {
		return deletiontime;
	}



	public void setDeletiontime(Date deletiontime) {
		this.deletiontime = deletiontime;
	}
	
	



	public SiNoType getUrgente() {
		return urgente;
	}



	public void setUrgente(SiNoType urgente) {
		this.urgente = urgente;
	}
	
	



	public MuestraType getTipomuestra() {
		return tipomuestra;
	}



	public void setTipomuestra(MuestraType tipomuestra) {
		this.tipomuestra = tipomuestra;
	}
	
	



	public AvisoType getTipoaviso() {
		return tipoaviso;
	}



	public void setTipoaviso(AvisoType tipoaviso) {
		this.tipoaviso = tipoaviso;
	}



	public Centro getCentroconcurre() {
		return centroconcurre;
	}



	public void setCentroconcurre(Centro centroconcurre) {
		this.centroconcurre = centroconcurre;
	}



	public String getInfodadaalpaciente() {
		return infodadaalpaciente;
	}



	public void setInfodadaalpaciente(String infodadaalpaciente) {
		this.infodadaalpaciente = infodadaalpaciente;
	}
	
	
	



	public String getNuevoprotocolo() {
		return nuevoprotocolo;
	}



	public void setNuevoprotocolo(String nuevoprotocolo) {
		this.nuevoprotocolo = nuevoprotocolo;
	}



	public Set<Area> getAreasnotificadas() {
		return areasnotificadas;
	}



	public void setAreasnotificadas(Set<Area> areasnotificadas) {
		this.areasnotificadas = areasnotificadas;
	}



	@Override
	public String toString() {
		return "id: " + this.getId();
	}

	@Override
	public boolean equals(Object o) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return 0;
	}
	
    
}